/**
 * 工具类
 */
var Util = {
	/**
	 * 空（包括0）
	 * @param v
	 */
	nvl: function(v) {		
		if ('' === v || null == v || 'null' === v) {
			return true;
		}
		return false;
	},

	/**
	 * 未定义
	 * @param v
	 */
	undfd: function(v) {
		if (typeof (v) == 'undefined') {
			return true;
		}
		return false;
	},
	isUndefined : function(v){
		if (typeof(v) == "undefined") { 
			return true;
		}  
		return false;
	},
	/**
	 * 根据id获取对象引用
	 * @param x
	 */
	id: function(x) {
		if (typeof (x) == 'string') {
			return document.getElementById(x);
		}
		return x;
	},
    alert:function(msg){
	  swal("提示！",msg,"info")
    },
	/**
	 * 信息
	 */
	msg: {



		/**
		 * 等待遮罩层
		 */
		waiting: function(msg) {
			var defMsg = msg?msg:'正在处理，请稍待。。。';  
			if(!$("#mask")[0])
		        $("<div id='mask' class=\"datagrid-mask\" style='z-index:1000'></div>").appendTo("body"); 
		    if(!$("#maskMsg")[0]) 
		        $("<div id='maskMsg' class=\"datagrid-mask-msg\" style='z-index:1001;left:50%;margin-left:-75px;'>"+defMsg+"</div>").appendTo("body");  
		        
			$("#mask,#maskMsg").show();
		},
		/**
		 * 等待遮罩层移除
		 */
		waitOver: function() {			
			$("#mask,#maskMsg").hide();
		},
	},
	date : {
		/**
    	 * 将Date转化为指定格式的String，月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 
    	 * 可以用 1-2 个占位符，年(y)可以用1-4个占位符，毫秒(S)只能用1个占位符(是1-3位的数字)   
    	 * @param d 日期对象
    	 * @param fmt 格式串
    	 * @return 指定格式后的日期字符串
    	 * 例子：  
    	 * (format(d,'yyyy-MM-dd hh:mm:ss.S') ==> 2006-07-02 08:09:04.423 
    	 * (format(d,'yyyy-M-d h:m:s.S')      ==> 2006-7-2 8:9:4.18 
    	 */
		format : function(d, fmt) {
			var o = {
				'M+': d.getMonth() + 1,// 月份
				'd+': d.getDate(),// 日
				'h+': d.getHours(),// 小时
				'm+': d.getMinutes(),// 分
				's+': d.getSeconds(),// 秒
				'q+': Math.floor((d.getMonth() + 3) / 3),// 季度
				'S': d.getMilliseconds()// 毫秒
			};
			if (/(y+)/.test(fmt)) {
				fmt = fmt.replace(RegExp.$1, (d.getFullYear() +'')
						.substr(4 - RegExp.$1.length));
			}
			for (var k in o) {
				if (new RegExp('('+ k +')').test(fmt)) {
					fmt = fmt.replace(RegExp.$1,
							(RegExp.$1.length == 1) ? (o[k]) : (('00' + o[k])
									.substr(('' + o[k]).length)));
				}
			}
			return fmt;
		},

		/**
		 * 获得指定年月前推n年的时间
		 * now 起始时间(时间格式或yyyy/MM/dd等有正常的分隔符数据格式,建议'yyyy/MM/dd')
		 * num 前推间隔时间
		 * fmt 格式化时间输出格式
		 */
		getIntervalYear: function(now, num, fmt){
			if (!now) {
				return null;
			}
			if(!now instanceof Date){
				now = new Date(now);
				if (!now) {
					return null;
				}
			}
			now.setDate(1);// 设置为月初1号
			var years = [];
			for (var i = 0; i < num; i++) {
				years[i] = Util.date.format(now, fmt ? fmt : 'yyyy');
				now.setFullYear(now.getFullYear() - 1);
			}
			return years;
		},
		/**
		 * 获得指定年月前推n月的时间
		 * now 起始时间(时间格式或yyyy/MM/dd等有正常的分隔符数据格式,建议'yyyy/MM/dd')
		 * num 前推间隔时间
		 * fmt 格式化时间输出格式
		 */
		getIntervalMonth: function(now, num, fmt){
			if (!now) {
				return null;
			}
			if(!(now instanceof Date)){
				now = new Date(now);
				if (!now) {
					return null;
				}
			}
			now.setDate(1);// 设置为月初1号
			var months = [];
			for (var i = 0; i < num; i++) {
				months[i] = Util.date.format(now, fmt ? fmt : 'yyyyMM');
				now.setMonth(now.getMonth() - 1);
			}
			return months;
		},
		/**
		 * 获得指定年周前推n周的时间
		 * now 起始时间(时间格式或yyyy/WW等有正常的分隔符数据格式,建议'yyyy/WW')
		 * num 前推间隔时间
		 * format 格式化时间输出格式
		 */
		getIntervalWeek: function(now, num){
			if ('' == now || null == now) {
				return now;
			}
			var Y = parseInt(now.substring(0, 4));
			var W = parseInt(now.substring(4, 6), 10);
			if (W > num) {
				var cw = W - num + 1;
				return Y.toString() + (cw < 10 ? ('0'+ cw) : (''+ cw));
			} else {
				var cw = 53 - num - W + 1;
				return (Y - 1).toString() + (cw < 10 ? ('0'+ cw) : (''+ cw));
			}
		},
		/**
		 * 只接受yyyy#MM#格式的数据请求
		 */
		dateStrToDate : function(dateStr){
			return new Date(dateStr.substring(0,4)+"/"+dateStr.substring(5,7)	+"/01 00:00:00");
		},
		/**
		 * 字符串转化为日期
		 * @param str
		 */
		strToDate: function(str) {
			if (!str) {
				return null;
			}
			var d = null;
			if (str.indexOf('-') > 0 || str.indexOf('/') > 0) {
				d = new Date(str);
			} else if (str.length == 6) {
				d = new Date();
				d.setFullYear(str.substr(0, 4));
				d.setMonth(parseInt(str.substr(4, 2)) - 1);
			} else if (str.length == 10) {
				d = new Date();
				d.setFullYear(str.substr(0, 4));
				d.setMonth(parseInt(str.substr(4, 2)) - 1);
				d.setDate(str.substr(6, 2));
			}
			return d;
		},
		/**
		 * 两个日期相差天数
		 */
		dateDifferDays: function(sd, ed) {
			if (!sd && !sd) {
				return null;
			}
			// 相差秒数
			var ss = (ed.getTime() - sd.getTime()) / 1000;
			return ss / (24 * 60 * 60);
		}
	},
	/**
	 * 服务器返回错误统一处理
	 * {stateCode: int,stateMsg: string,...}
	 * @param data
	 * @param errMsg
	 */
	error: function(data, errMsg) {
		if (!Util.undfd(data.stateCode) && !Util.nvl(data.stateCode)
				&& data.stateCode == 400) {
			var msg = errMsg ? errMsg : data.stateMsg;
			if (!Util.undfd($.messager) && !Util.nvl($.messager)) {
				$.messager.alert('错误信息', msg, 'error');
			} else {
				alert(data.stateMsg);
			}
			return true;// 有错误
		}
		return false;// 无错误
	},
	/**
	 * ajax post请求
	 * @param url
	 * @param param
	 * @param succ 执行成功回调函数
	 * @param succMsg 执行成功提示信息
	 * @param err 执行失败回调函数
	 * @param errMsg 执行失败提示信息
	 */
	doPost: function(url, param, succ, succMsg, err, errMsg) {			
		// ajax请求
		$.ajax({
			url: CONTEXT_PATH + url,
			data: param,
			type: 'POST',
			dataType: 'json',
			cache: false,
			beforeSend: function() {
                swal("正在加载...","","info");
			},
			success: function(json) {
				// 等待结束
                swal("加载完成！","","success");
                succ(json);
			},
			complete: function() {

			},
			error: function(jqXHR, textStatus, errorThrown) {
                swal("加载失败...","","error");

			}
		});
	},
	/**
	 * ajax get请求
	 * @param url
	 * @param param
	 * @param succ 执行成功回调函数
	 * @param succMsg 执行成功提示信息
	 * @param err 执行失败回调函数
	 * @param errMsg 执行失败提示信息
	 */
	doGet: function(url, param, succ, succMsg, err, errMsg) {
		// ajax请求
		$.ajax({
			url: CONTEXT_PATH + url,
			data: param,
			type: 'GET',
			dataType: 'json',
			cache: false,
			beforeSend: function() {
				// 等待
			},
			success: function(json) {
                swal("加载完成！","","success");
                succ(json);
			},
			complete: function() {
				// 等待结束
			},
			error: function(jqXHR, textStatus, errorThrown) {
				// 等待结束
                swal("加载失败...","","error");
			}
		});
	},
	/**
	 * 简单的ajax post请求
	 * @param url
	 * @param param
	 * @param fn
	 * @param type
	 */
	post: function(url, param, fn, type) {			
		$.post(CONTEXT_PATH + url, param, fn, type);
	},
	/**
	 * 简单的ajax get请求
	 * @param url
	 * @param param
	 * @param fn
	 */
	get: function(url, param, fn) {
		$.get(CONTEXT_PATH + url, param, fn);
	},
	/**
	 * 设置标签html内容
	 * @param id 控件id
	 * @param html 内容
	 */
	setHtml: function(id, html) {
		if (!Util.undfd(id) && !Util.nvl(id)) {
			$('#'+ id).html(Util.defVal(html));
		}
	},
	/**
	 * 设置attr值
	 * @param id
	 * @param attr
	 * @param val
	 */
	setAttr: function(id, attr, val) {
		if (!Util.undfd(id) && !Util.nvl(id)
				&& !Util.undfd(attr) && !Util.nvl(attr)
				&& !Util.undfd(val) && !Util.nvl(val)) {
			$('#'+ id).attr(attr, val);
		}
	},
	/**
	 * 移除class
	 * @param id 控件id
	 * @param className
	 */
	removeClass: function(id, className) {
		if ($('#'+ id).hasClass(className)) {
			$('#'+ id).removeClass(className);
		}
	},
	/**
	 * 添加class
	 * @param id 控件id
	 * @param className
	 */
	addClass: function(id, className) {
		if (!$('#'+ id).hasClass(className)) {
			$('#'+ id).addClass(className);
		}
	},
	/**
	 * 默认值
	 * @param v
	 * @param def
	 */
	defVal: function(v, def) {
		if (Util.nvl(v) || Util.undfd(v)) {
			return def ? def : '-';
		} else {
			return v;
		}
	},

	
	/**
	 * 获取url参数
	 * @param name
	 */
	getURLParameter: function(name) {
		var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
		var r = window.location.search.substr(1).match(reg);
		if (r != null) return r[2]; return null;
	},

	/**
	 * 默认值
	 * @param v
	 * @param def
	 */
	valFormat: function(v, def) {
		if (Util.nvl(v) || Util.undfd(v)) {
			return def ? def : '';
		} else {
			return parseFloat(v).toFixed(2);
		}
	},





	/**
	 * 监听对象属性(包括dom对象、js普通对象等一切Object,只适用脚本赋值[即等号赋值],不适用鼠标/键盘操作赋值[可使用onpropertychange/oninput等事件])
	 * @param obj
	 * @param prop
	 * @param handler
	 */
	watch:function(obj,prop,handler)
	{	
        var oldval = obj[prop], newval = oldval,
        getter = function ()
        {
            return newval;
        },
        setter = function (val) 
        {        	
            oldval = newval;            
            newval=val;              
            handler(oldval, newval);
        };
        if (Object.defineProperty)
        {           
             Object.defineProperty(obj, prop, {get: getter,set: setter});
        }
        else if (obj.__defineGetter__ && obj.__defineSetter__) 
        {
        	obj.__defineGetter__(prop, getter);
        	obj.__defineSetter__(prop, setter);
        }	
	},
	/**
	 * 获取时间轴data
	 */
	getTimeLineData: function(y){
		var y = (!Util.isUndefined(y) && !Util.nvl(y)) ? y : (new Date()).getFullYear();
		return [y +'-01-01', y +'-02-01', y +'-03-01', y +'-04-01', y +'-05-01', y +'-06-01'
		        , y +'-07-01', y +'-08-01', y +'-09-01', y +'-10-01', y +'-11-01', y +'-12-01'];
	},


	/**
	 * 秒-->d天h时m分
	 * @param val 秒
	 */
	secondToDHM: function(val){
		if(Util.isUndefined(val) || Util.nvl(val)){
			return '';
		}
		var s = Math.abs(val);// 使用绝对值计算,负数在结果前加-
		// d 86400
		var d = parseInt(s / 86400);
		// h  3600
		var h = parseInt(s % 86400 / 3600);
		// m 60
		var m = (s % 3600 / 60).toFixed(0);
		// 分钟小时是否有进位的情况
		if(m == 60){
			// 分钟进位
			h += 1;
			m = 0;
		}
		if(h == 24){
			// 小时进位
			d += 1;
			h = 0;
		}
		var dhm = '';
		if(d != 0){
			dhm += d +'天';
		}
		if(h != 0){
			dhm += h +'小时';
		}
		if(m != 0){
			dhm += m +'分';
		}else{
			if(dhm.length == 0){
				dhm += m +'分';
			}
		}
		if(val < 0){
			dhm = '-'+ dhm;
		}
		return dhm;
	},
	/**
	 * 秒转为带小数点的天
	 * @param {} val
	 * @return {String}
	 */
	secondToDays: function(val){
		if(Util.isUndefined(val) || Util.nvl(val)){
			return '';
		}
		var s = Math.abs(val);// 使用绝对值计算,负数在结果前加-
		// d 86400
		var d = (s / 86400).toFixed(2);
		
		if(val < 0){
			d = '-'+ d;
		}
		return d;
	},

	/**
	 * 获取UUID
	 */
	getUUID: function(f){
		var separate = "-";
		if(f) separate = "";
	    var s = [];
	    var hexDigits = "0123456789abcdef";
	    for (var i = 0; i < 36; i++) {
	        s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
	    }
	    s[14] = "4";  // bits 12-15 of the time_hi_and_version field to 0010
	    s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1);  // bits 6-7 of the clock_seq_hi_and_reserved to 01
	    s[8] = s[13] = s[18] = s[23] = separate;

	    var uuid = s.join("");
	    return uuid;
	}
};
